/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import modelo.Consumidor;
import modelo.Ingreso;
import modelo.Usuario;
import negocio.ConsumidorBI;
import negocio.IngresoBI;
import negocio.UsuarioBI;

/**
 *
 * @author Francisco
 */
@ManagedBean(name="aportarMtoingCtrl")
@ViewScoped
public class AportarMontoIngresoCtrl {
    
    @Inject
    private UsuarioBI usuarioBI;
    @Inject
    private ConsumidorBI consumidorBI;
    @Inject
    private IngresoBI ingresoBI;
    
    private Usuario usuario;
    private LoginCtrl login;
    
    private Integer idConsumidorSeleccionado;
    private String idIngresoSeleccionado;
    private Double monto;
    private String descripcion;
    private Map<String, Integer> consumidores;
    private Map<String, String> ingresos = new HashMap<String, String>();
    
    @PostConstruct
    public void init(){
        try{
            login = (LoginCtrl)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("login");
            String nombreUsuario = login.getUsuario();
            usuario = usuarioBI.buscarUsuario(nombreUsuario);
            List<Consumidor> consumidoresUsu = consumidorBI.buscarConsumidoresIngresoPorUsuario(usuario.getIdUsuario());
            consumidores = new HashMap<String, Integer>();
            for (Consumidor consumidor : consumidoresUsu) {
                if(consumidor.getEstatus().equals("A")&&!consumidor.getTipo().equals("AHORRO")){
                    consumidores.put(consumidor.getNombre(), consumidor.getIdConsumidor());
                }
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void seleccionoConsumidor(){
        try{
            if(idConsumidorSeleccionado!=null){
                Consumidor consumidor = consumidorBI.buscarConsumidor(idConsumidorSeleccionado);
                ingresos = new HashMap<String, String>();
                if(consumidor.getIngresoList()!=null && consumidor.getIngresoList().size()>0){
                    for (Ingreso ingreso : consumidor.getIngresoList()) {
                        if(ingreso.getEstatus().equals("A")){
                            ingresos.put(ingreso.getNombre(), ingreso.getIdIngreso().toString());
                        }
                    }
                }
            }else{
                ingresos = null;
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void aportar(){
        try{
            if(idConsumidorSeleccionado==null){
                throw new Exception("Se debe seleccionar un monto");
            }
            if(idIngresoSeleccionado==null){
                throw new Exception("Se debe seleccionar un ingreso");
            }
            if(monto==null || monto<0){
                throw new Exception("Se debe capturar un monto positivo");
            }
            Consumidor consumidor = consumidorBI.buscarConsumidor(idConsumidorSeleccionado);
            if(consumidor==null){
                throw new Exception("No existe el consumidor");
            }
            boolean existeIngreso = false;
            for (Ingreso ingreso : consumidor.getIngresoList()) {
                if(ingreso.getIdIngreso().equals(Integer.valueOf(idIngresoSeleccionado))){
                    existeIngreso = true;
                }
            }
            if(!(existeIngreso)){
                throw new Exception("No existe el ingreso");
            }
            Double capital = ingresoBI.aportarMonto(Integer.valueOf(idIngresoSeleccionado), monto, usuario, descripcion);
            cancelar();
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "Listo", "Guardado con éxito, su saldo es: "+capital));
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void cancelar(){
        idConsumidorSeleccionado = null;
        idIngresoSeleccionado = null;
        ingresos = null;
        monto = null;
        descripcion=null;
    }

    public Map<String, Integer> getConsumidores() {
        return consumidores;
    }

    public void setConsumidores(Map<String, Integer> consumidores) {
        this.consumidores = consumidores;
    }

    public Map<String, String> getIngresos() {
        return ingresos;
    }

    public void setIngresos(Map<String, String> ingresos) {
        this.ingresos = ingresos;
    }

    public Double getMonto() {
        return monto;
    }

    public void setMonto(Double monto) {
        this.monto = monto;
    }

    public Integer getIdConsumidorSeleccionado() {
        return idConsumidorSeleccionado;
    }

    public void setIdConsumidorSeleccionado(Integer idConsumidorSeleccionado) {
        this.idConsumidorSeleccionado = idConsumidorSeleccionado;
    }

    public String getIdIngresoSeleccionado() {
        return idIngresoSeleccionado;
    }

    public void setIdIngresoSeleccionado(String idIngresoSeleccionado) {
        this.idIngresoSeleccionado = idIngresoSeleccionado;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    
}
